package com.company.pangu.tencent.sms.client;

import com.company.pangu.tencent.sms.config.SmsConfig;
import com.company.pangu.tencent.sms.constants.SmsConstants;
import com.company.pangu.tencent.sms.request.SmsSendRequest;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.Arrays;
import java.util.Objects;

/**
 * <p>sms client</p >
 *
 * @author youyoukele
 * @version 1.0
 * @date 2023/2/7 下午6:20
 */
@Slf4j
public class SmsClient {

    private final com.tencentcloudapi.sms.v20210111.SmsClient client;

    public SmsClient(SmsConfig smsConfig) {
        Credential cred = new Credential(smsConfig.getSecretId(), smsConfig.getSecretKey());
        // 实例化一个http选项，可选，没有特殊需求可以跳过
        HttpProfile httpProfile = new HttpProfile();
        // 设置代理（无需要直接忽略）
        // httpProfile.setProxyHost("真实代理ip");
        // httpProfile.setProxyPort(真实代理端口);
        /* SDK默认使用POST方法。
         * 如果你一定要使用GET方法，可以在这里设置。GET方法无法处理一些较大的请求 */
        httpProfile.setReqMethod("POST");
        /* SDK有默认的超时时间，非必要请不要进行调整
         * 如有需要请在代码中查阅以获取最新的默认值 */
        httpProfile.setConnTimeout(60);
        /* 指定接入地域域名，默认就近地域接入域名为 sms.tencentcloudapi.com ，也支持指定地域域名访问，例如广州地域的域名为 sms.ap-guangzhou.tencentcloudapi.com */
        httpProfile.setEndpoint("sms.tencentcloudapi.com");

        /* 非必要步骤:
         * 实例化一个客户端配置对象，可以指定超时时间等配置 */
        ClientProfile clientProfile = new ClientProfile();
        clientProfile.setHttpProfile(httpProfile);
        client = new com.tencentcloudapi.sms.v20210111.SmsClient(cred, smsConfig.getRegion(), clientProfile);
    }

    /**
     * 短信发送接口，用于给用户发短信验证码、通知类短信或营销短信。
     * https://cloud.tencent.com/document/product/382/43194
     * <p>
     * >- 注：由于云 **API3.0 安全性**有所提升，所以**接口鉴权**较为复杂，建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。
     * >- 注：您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口，可以先免去签名计算步骤。运行成功后，API Explorer可以**自动生成**SDK代码示例。
     * >- 注：当前接口属于 2021-01-11 版本，如果您仍在使用 [2019-07-11 版本](https://cloud.tencent.com/document/product/382/38778)，建议您使用当前最新版本的接口，版本差异可参考[版本描述](https://cloud.tencent.com/document/product/382/63195#.E7.89.88.E6.9C.AC.E6.8F.8F.E8.BF.B0)。
     *
     * @param request
     */
    public void sendSms(SmsSendRequest request) {
        SendSmsRequest req = new SendSmsRequest();
        req.setPhoneNumberSet(request.getPhoneNumberSet());
        req.setSmsSdkAppId(request.getSmsSdkAppId());
        req.setTemplateId(request.getTemplateId());
        req.setSignName(request.getSignName());
        req.setTemplateParamSet(request.getTemplateParamSet());
        try {
            SendSmsResponse res = client.SendSms(req);
            log.info("send sms response {}", SendSmsResponse.toJsonString(res));
            if (Objects.nonNull(res.getSendStatusSet())) {
                boolean result = Arrays.stream(res.getSendStatusSet())
                        .allMatch(it -> StringUtils.equals(it.getCode(), SmsConstants.SUCCESS));
                if (result) {
                    return;
                }
            }
            log.info("send sms error {}", SendSmsResponse.toJsonString(res));
        } catch (TencentCloudSDKException e) {
            log.error("send sms error", e);
        }
        throw new RuntimeException("sms send has error");
    }

}
